DetectionPostProcess
DetectionPostProcess 算子用于目标检测模型的后处理阶段,对网络预测的候选框和置信度进行解码、筛选和非极大值抑制(NMS),输出最终检测结果。 其主要功能包括: 1. 根据 anchor 信息对候选框进行解码; 2. 对各类别的候选框执行 NMS 操作; 3. 输出选中的检测框、类别及分数。
- 输入:
input_boxes - 检测框坐标数据地址,形状为
[num_boxes, 4]。input_scores - 每个检测框对应的置信度分数,形状为
[num_boxes, num_classes_with_bg_]。anchors - Anchor 坐标数据地址,形状为
[num_boxes, 4]。num_boxes - 候选框数量。
num_classes_with_bg - 含背景类在内的类别数量。
core_mask (int, 可选) - 核掩码(仅适用于共享存储版本)。
param - 算子参数结构体,包含 NMS 阈值、检测数量限制、坐标缩放因子等。
结构体定义:
1typedef struct { 2 bool use_regular_nms; 3 int num_classes; 4 int max_detections; 5 int max_classes_per_detection; // Fast NMS使用 6 int detections_per_class; // Regular NMS使用 7 float nms_score_threshold; 8 float nms_iou_threshold; 9 float y_scale; 10 float x_scale; 11 float h_scale; 12 float w_scale; 13 int num_boxes; 14 int num_classes_with_bg; 15 16 void *decoded_boxes; 17 uint8_t *nms_candidate; 18 int32_t *selected; 19 float *scores; 20 int32_t *indexes; 21 float *all_class_scores; 22 int32_t *all_class_indexes; 23 int32_t *single_class_indexes; 24 25 // INT8 量化参数(仅在 Int8 模式下使用) 26 float boxes_scale; 27 int32_t boxes_zero_point; 28 float scores_scale; 29 int32_t scores_zero_point; 30 31} DetectionPostProcessParameter;
- 输出:
output_boxes - 输出检测框坐标。
output_classes - 输出检测框类别索引。
output_scores - 输出检测框对应的置信度。
output_num - 实际输出的检测框数量。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持 fp32, int8
MT7004 支持 fp16, fp32
共享存储版本:
-
void fp_detection_post_process_s(const float *input_boxes, const float *input_scores, const float *anchors, float *output_boxes, float *output_classes, float *output_scores, float *output_num, DetectionPostProcessParameter *param, int core_mask)
-
void i8_detection_post_process_s(const int8_t *input_boxes, const int8_t *input_scores, const float *anchors, float *output_boxes, float *output_classes, float *output_scores, float *output_num, DetectionPostProcessParameter *param, int core_mask)
-
void hp_detection_post_process_s(const half *input_boxes, const half *input_scores, const half *anchors, half *output_boxes, float *output_classes, half *output_scores, float *output_num, DetectionPostProcessParameter *param, int core_mask)
C调用示例:
1//FT78NE示例 2#include <stdio.h> 3 4int main(int argc, char* argv[]) { 5 float *input_boxes = (float *)0xA0000000; 6 float *input_scores = (float *)0xA1000000; 7 float *anchors = (float *)0xA2000000; 8 float *output_boxes = (float *)0xA3000000; 9 float *output_classes = (float *)0xA4000000; 10 float *output_scores = (float *)0xA5000000; 11 float *output_num = (float *)0xA6000000; 12 DetectionPostProcessParameter* param = (DetectionPostProcessParameter*)0xA7000000; 13 14 param->use_regular_nms = true; 15 param->num_classes = 3; 16 param->max_detections = 50; 17 param->max_classes_per_detection = 1; 18 param->detections_per_class = 50; 19 param->nms_score_threshold = 0.1f; 20 param->nms_iou_threshold = 0.5f; 21 param->y_scale = 10.0f; 22 param->x_scale = 10.0f; 23 param->h_scale = 5.0f; 24 param->w_scale = 5.0f; 25 param->num_boxes = 100; 26 param->num_classes_with_bg = 4; 27 28 int core_mask = 0xff; 29 30 fp_detection_post_process_s(input_boxes, input_scores, anchors, output_boxes, output_classes, output_scores, output_num, param, core_mask); 31 return 0; 32}
私有存储版本:
-
void fp_detection_post_process_p(const float *input_boxes, const float *input_scores, const float *anchors, float *output_boxes, float *output_classes, float *output_scores, float *output_num, DetectionPostProcessParameter *param)
-
void i8_detection_post_process_p(const int8_t *input_boxes, const int8_t *input_scores, const float *anchors, float *output_boxes, float *output_classes, float *output_scores, float *output_num, DetectionPostProcessParameter *param)
-
void hp_detection_post_process_p(const half *input_boxes, const half *input_scores, const half *anchors, half *output_boxes, float *output_classes, half *output_scores, float *output_num, DetectionPostProcessParameter *param)
C调用示例:
1//MT7004示例 2#include <stdio.h> 3 4int main(int argc, char* argv[]) { 5 DetectionPostProcessParameter param; 6 7 param.use_regular_nms = 1; 8 param.num_classes = 3; 9 param.max_detections = 50; 10 param.max_classes_per_detection = 1; 11 param.detections_per_class = 50; 12 param.nms_score_threshold = 0.1f; 13 param.nms_iou_threshold = 0.5f; 14 param.y_scale = 10.0f; 15 param.x_scale = 10.0f; 16 param.h_scale = 5.0f; 17 param.w_scale = 5.0f; 18 param.num_boxes = 1917; 19 param.num_classes_with_bg = 4; 20 21 float *input_boxes = (float *)0xA0000000; 22 float *input_scores = (float *)0xA1000000; 23 float *anchors = (float *)0xA2000000; 24 float *output_boxes = (float *)0xA3000000; 25 float *output_classes = (float *)0xA4000000; 26 float *output_scores = (float *)0xA5000000; 27 float *output_num = (float *)0xA6000000; 28 29 fp_detection_post_process_p(input_boxes, input_scores, anchors, output_boxes, output_classes, output_scores, output_num, param); 30 return 0; 31}